#include"BlockQueue.hpp"
#include"Task.hpp"
#include<unistd.h>

void *Consumer(void *args)
{
    BlockQueue<Task> *bq=static_cast<BlockQueue<Task>*>(args);

    while(true)
    {
        /*
        //消费
        int data=bq->pop();
        std::cout<<"消费了一个数据:"<<data<<std::endl;
        //sleep(2);
        */

       //消费计算
       Task t=bq->pop();
       t.run();

        std::cout<<"处理任务："<<t.GetTask()<<"运算结果是："<<t.GetResult()<<" thread id:"<<pthread_self()<<std::endl;
        usleep(1);
    }
}

void *Productor(void *args)
{
    int len=opers.size();  
    BlockQueue<Task> *bq=static_cast<BlockQueue<Task>*>(args);
    int x=10;
    int y=20;
    //int data=0;
    while(true)
    {
        /*
        //sleep(1);
        //生产
        data++;
        bq->push(data);
        std::cout<<"生产了一个数据:"<<data<<std::endl;
        */

        //模拟生成者生产数据
        int data1=rand()%10+1;
        usleep(10);
        int data2=rand()%10;
        char op=opers[rand()%len]; 
        Task t(data1,data2,op);

       //生产
       bq->push(t);
       std::cout<<"生产了一个任务"<<t.GetTask()<<std::endl;
       sleep(1);
    }
}

int main()
{   
    //BlockQueue 内部还可以传递任务
    //初始化阻塞队列和生产者消费者
    BlockQueue<Task> *bq=new BlockQueue<Task>();
    pthread_t c[3],p[5];
    for(int i=0;i<3;i++)
    {
        pthread_create(c+i,nullptr,Consumer,bq);
    }
    
    for(int i=0;i<5;i++)
    {
        pthread_create(p+i,nullptr,Productor,bq);
    }
    
    for(int i=0;i<3;i++)
    {
        pthread_join(c[i],nullptr);
    }

    for(int i=0;i<5;i++)
    {
        pthread_join(p[i],nullptr);
    }
    delete bq;

    return 0;
}